package main
import (
	"fmt"
)
//接口VS继承
//可以理解成接口是继承的补充,解耦的方式对继承进行扩展
//小猴子继承老猴子，但是可以实现小鸟，鱼接口来实现飞翔和游泳
func main(){
	monkey := LittleMonkey{
		Monkey{
			Name : "悟空",
		},
	}
	monkey.climbing()
	var ba BirdAble = &monkey
	ba.Flying()
	var f Firsh = &monkey
	f.Swimming()
	monkey.Flying()
}


type Monkey struct{
	Name string
}
func (this *Monkey)climbing(){
	fmt.Println("猴崽生来就就会爬树！~")
}
type LittleMonkey struct{
	Monkey
}

type BirdAble interface{
	Flying()
}
type Firsh interface{
	Swimming()
}

func (lm *LittleMonkey)Flying(){
	fmt.Println("猴子通过学习学会了飞翔~")
}
func (lm *LittleMonkey)Swimming(){
	fmt.Println("猴子通过学习学会了游泳~")
}

//代码小结：
//1、当A结构体继承了B结构体，那么A结构体就自动继承了B结构体的字段和方法，并且可以直接使用
//2、当A结构体需要扩展功能，同时不希望破坏继承关系，则可以去实现某个接口即可，因此可以说实现接口是继承机制的补充~！